// import { useWebSocket } from '@vueuse/core'
// import type { UseWebSocketReturn } from '@vueuse/core'
// import queryString from 'query-string'
// import { isUndefined } from 'lodash-es'
// import { WEBSOCKET_INIT_EVENTS } from '@/helpers/constants'
// import type { WebSocketEventTypes, WebSocketEventData } from '@/types/global'
// import { useWebsocketStore } from '@/store/websocket'
// import { useGlobalStore } from '@/store'
// const useWS = () => {
//   const sendList = ref<string[]>([])
//   const websocketRef = ref<UseWebSocketReturn<any>>()
//   const instanceId = ref<string>()

//   const eventMap = ref<Map<WebSocketEventTypes, Function[]>>(new Map())

//   const globalStore = useGlobalStore()
//   const websocketStore = useWebsocketStore()
//   const addSocketListener = (key: WebSocketEventTypes, fn: Function) => {
//     if (!eventMap.value.has(key)) {
//       eventMap.value.set(key, [fn])
//     } else {
//       eventMap.value.get(key)?.push(fn)
//     }
//   }
//   const removeSocketListener = (key: WebSocketEventTypes) => {
//     eventMap.value.delete(key)
//   }

//   const url = queryString.stringifyUrl({
//     url: useRuntimeConfig().public.wsURL,
//     query: globalStore.token
//       ? {
//           token: globalStore.token,
//         }
//       : {},
//   })

//   const init = (token?: string) => {
//     if (token === instanceId.value && token) {
//       return websocketRef.value
//     } else if (!isUndefined(websocketRef.value) && websocketRef.value.status.value === 'CONNECTING') {
//       console.log('关闭socket', websocketRef.value, token === instanceId.value)
//       websocketRef.value?.close()
//     }
//     const _ws: UseWebSocketReturn<any> = useWebSocket(url, {
//       autoReconnect: {
//         retries: 3,
//         delay: 1000,
//         onFailed() {
//           console.error('Failed to connect WebSocket after 3 retries')
//         },
//       },
//       heartbeat: {
//         message: 'ping',
//         interval: 5000,
//         pongTimeout: 2000,
//       },
//       onDisconnected: () => {
//         // TODO
//       },
//       onConnected: (_ws: WebSocket) => {},
//       onMessage: (_ws: WebSocket, event: MessageEvent<any>) => {
//         if (event.data === 'Opened') {
//           WEBSOCKET_INIT_EVENTS.forEach((eventKey: string) => {
//             _ws.send(JSON.stringify({ event: eventKey }))
//           })
//           sendList.value.forEach((data) => {
//             sendMessage(data)
//           })
//           sendList.value = []
//           return
//         }
//         if (event.data === JSON.stringify({ data: 'pong' })) {
//           return
//         }
//         const res: WebSocketEventData = JSON.parse(event.data)
//         eventMap.value.get(res.event)?.forEach((call) => {
//           if (call && typeof call === 'function') {
//             call(res.data)
//           }
//         })
//         if (typeof websocketStore[res.event] === 'function') {
//           websocketStore[res.event]?.(res.data)
//         }
//       },
//       onError: (_ws: WebSocket, event: any) => {
//         console.warn('event error', event)
//         if (event.code !== 1000) {
//           // TODO
//         }
//       },
//     })
//     websocketRef.value = _ws
//     instanceId.value = token
//   }

//   const destory = () => {
//     if (websocketRef.value) {
//       websocketRef.value.close()
//       nextTick(() => {
//         websocketStore.$reset()
//       })
//     }
//   }

//   const sendMessage = (data: string) => {
//     if (websocketRef.value) {
//       if (isJSONString(data)) {
//         websocketRef.value.send(data)
//       } else {
//         console.error('message must be a JSON object')
//       }
//     } else {
//       sendList.value.push(data)
//       init()
//     }
//   }

//   return {
//     init,
//     destory,
//     addSocketListener,
//     removeSocketListener,
//     sendMessage,
//     websocketRef,
//     instanceId,
//     eventMap,
//   }
// }
// export default useWS
